package com.ics.atable.chat.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ics.atable.chat.mapper.ChatSessionMapper;
import com.ics.atable.chat.model.entity.ChatSession;
import com.ics.atable.chat.service.ChatSessionService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.UUID;

/**
 * ChatSessionService 实现。
 * 说明：
 * - 依赖 MyBatis-Plus 的通用 CRUD 能力，通过 ServiceImpl 基类获取基础操作。
 * - 统一在服务层补全默认值、生成主键以及维护时间戳。
 */
@Service
public class ChatSessionServiceImpl extends ServiceImpl<ChatSessionMapper, ChatSession>
    implements ChatSessionService {

	/**
	 * 创建会话，若未传入 id 则自动生成 UUID；补全默认字段并持久化。
	 *
	 * @param session 会话实体
	 * @return 新建会话 ID
	 * @throws IllegalArgumentException 当参数为空时
	 */
	@Override
	public String createSession(ChatSession session) {
		if (session == null) {
			throw new IllegalArgumentException("session is null");
		}
		// 生成ID
		if (StringUtils.isBlank(session.getId())) {
			session.setId(UUID.randomUUID().toString());
		}
		// 默认值
		if (StringUtils.isBlank(session.getTitle())) {
			session.setTitle("新对话");
		}
		if (StringUtils.isBlank(session.getStatus())) {
			session.setStatus("active");
		}
		if (session.getIsPinned() == null) {
			session.setIsPinned(0);
		}
		Date now = new Date();
		session.setCreateTime(Objects.requireNonNullElse(session.getCreateTime(), now));
		session.setUpdateTime(Objects.requireNonNullElse(session.getUpdateTime(), now));
		boolean saved = this.save(session);
		if (!saved) {
			throw new IllegalStateException("create session failed");
		}
		return session.getId();
	}

	/**
	 * 根据 ID 选择性更新非空字段，并刷新更新时间。
	 *
	 * @param session 包含 ID 的会话实体
	 * @return 是否更新成功
	 * @throws IllegalArgumentException 当 ID 为空时
	 */
	@Override
	public boolean updateSession(ChatSession session) {
		if (session == null || StringUtils.isBlank(session.getId())) {
			throw new IllegalArgumentException("id is required");
		}
		session.setUpdateTime(new Date());
		return this.updateById(session);
	}

	/**
	 * 将会话状态置为 archived。
	 *
	 * @param id 会话 ID
	 * @return 是否成功
	 * @throws IllegalArgumentException 当 ID 为空时
	 */
	@Override
	public boolean archiveSession(String id) {
		if (StringUtils.isBlank(id)) {
			throw new IllegalArgumentException("id is required");
		}
		ChatSession update = new ChatSession();
		update.setId(id);
		update.setStatus("archived");
		update.setUpdateTime(new Date());
		return this.updateById(update);
	}

	/**
	 * 逻辑删除（状态置为 deleted）。
	 *
	 * @param id 会话 ID
	 * @return 是否成功
	 * @throws IllegalArgumentException 当 ID 为空时
	 */
	@Override
	public boolean deleteSession(String id) {
		if (StringUtils.isBlank(id)) {
			throw new IllegalArgumentException("id is required");
		}
		ChatSession update = new ChatSession();
		update.setId(id);
		update.setStatus("deleted");
		update.setUpdateTime(new Date());
		return this.updateById(update);
	}

	/**
	 * 设置/取消置顶（isPinned=1/0）。
	 *
	 * @param id 会话 ID
	 * @param pinned true 表示置顶
	 * @return 是否成功
	 * @throws IllegalArgumentException 当 ID 为空时
	 */
	@Override
	public boolean pinSession(String id, boolean pinned) {
		if (StringUtils.isBlank(id)) {
			throw new IllegalArgumentException("id is required");
		}
		ChatSession update = new ChatSession();
		update.setId(id);
		update.setIsPinned(pinned ? 1 : 0);
		update.setUpdateTime(new Date());
		return this.updateById(update);
	}

	/**
	 * 查询用户会话，排除 deleted，按置顶与更新时间倒序排序。
	 *
	 * @param userId 用户 ID
	 * @return 会话列表
	 */
	@Override
	public List<ChatSession> listSessionsByUser(Long userId) {
		LambdaQueryWrapper<ChatSession> wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(userId != null, ChatSession::getUserId, userId)
				.ne(ChatSession::getStatus, "deleted")
				.orderByDesc(ChatSession::getIsPinned)
				.orderByDesc(ChatSession::getUpdateTime);
		return this.list(wrapper);
	}

	/**
	 * 分页查询用户会话，排除 deleted，按置顶与更新时间倒序排序。
	 *
	 * @param userId 用户 ID
	 * @param page   当前页
	 * @param size   每页大小
	 * @return 分页结果
	 */
	@Override
	public Page<ChatSession> pageSessionsByUser(Long userId, long page, long size) {
		LambdaQueryWrapper<ChatSession> wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(userId != null, ChatSession::getUserId, userId)
				.ne(ChatSession::getStatus, "deleted")
				.orderByDesc(ChatSession::getIsPinned)
				.orderByDesc(ChatSession::getUpdateTime);
		Page<ChatSession> p = new Page<>(page, size);
		return this.page(p, wrapper);
	}
}